/**
 * 
 */
package com.intelap.fabricaciones;


import javax.persistence.EntityManager;

import com.intelap.utils.ProductorRecursos;


/** @author ggpollit */
public abstract class Entidad<T> {

	private final Class<T> tipo;
	protected Entidad(Class<T> tipo) {
		this.tipo = tipo;
	}

//	protected abstract boolean isCargada();

	private Repositorio<Entidad<T>> repositorio = null;
	public Repositorio<Entidad<T>> getRepositorio() {
		if (repositorio == null) {
			this.repositorio = ProductorRecursos.getManagedBeanParamTypeEstricto(this, Repositorio.class, tipo);
		}
		return this.repositorio;
	}

	private UnidadTrabajo uta;
	private UnidadTrabajo getUnidadTrabajo() {
		if (this.uta == null)
			this.uta = ConocedorUnidadTrabajoActual.getActual();
		else
			assert this.uta == ConocedorUnidadTrabajoActual.getActual();
		return this.uta;
	}

	protected void registrarNueva() {
		this.getUnidadTrabajo().registrarNueva(this);
	}
	protected void registrarSucia() {
//		if (this.isCargada())
			this.getUnidadTrabajo().registrarSucia(this);
	}
	protected void registrarQuitada() {
//		if (this.isCargada())
			this.getUnidadTrabajo().registrarQuitada(this);
	}
	protected void registrarLeida() {
//		if (this.isCargada())
			this.getUnidadTrabajo().registrarLeida(this);
	}

	protected abstract int getVersion();
	protected abstract void setVersion(int version);
	public void copiarVersionA(Entidad<T> destino, EntityManager em) {
		assert em.contains(this) && !em.contains(destino);
		destino.setVersion(this.getVersion());
	}

	
//	/**@deprecated porque descubrí {@link PersistenceUnitUtil} */
//	@Deprecated
//	public Entidad<T> getAtada() {
//		return this.getRepositorio().getAtada(this);
//	}
}
